package cn.itcast.order.service;

import cn.itcast.order.mapper.OrderMapper;
import cn.itcast.order.pojo.Order;
import cn.itcast.user.feign.UserClient;
import cn.itcast.user.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;


@Service
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private UserClient userClient;


    public Order queryOrderById(Long orderId) {
        // 1.查询订单   订单和订单所属的user_id
        Order order = orderMapper.findById(orderId);

        /*
         * 法一:使用restTemplate
         * 见该类下面封装的两个方法
         */

        /*
         * 法二:使用feign
         *
         * 使用feign的原因(也即使用restTemplate存在的问题):
         * 1)因为要去拼接url、故代码可读性差,编程体验不统一
         * 2)参数复杂时url难以维护
         *
         * feign最佳实践
         * 1)第一种方式为继承,让controller和FeignClient继承同一接口 ==> 不推荐
         * 2)第二种方法为抽取,将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用
         * 本案例使用第二种方案,单独抽取一个模块feign-api
         */
        User user = userClient.findById(order.getUserId());

        //3.将获取的User封装到order.user属性中
        order.setUser(user);

        // 4.返回
        return order;
    }

    /*-------------------------------------------------------------------------------------*/
    /*
     * 下面两种写法供参考
     * 一个写的服务名、这样可以实现负载均衡,另一个直接写死了"ip:port"
     */
    public Order queryOrderByIdRestTemplate(Long orderId) {
        // 1.查询订单   订单和订单所属的user_id
        Order order = orderMapper.findById(orderId);
        //2.获取user_id   请求http://localhost:8081/user/{user_id}   调用了user-service    远程调用  ->User
        //String url = "http://需要远程调用的服务的名字/user/"+order.getUserId();
        String url = "http://userservice/user/" + order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        //3.将获取的User封装到order.user属性中
        order.setUser(user);
        // 4.返回
        return order;
    }


    public Order queryOrderByIdUrl(Long orderId) {
        // 1.查询订单   订单和订单所属的user_id
        Order order = orderMapper.findById(orderId);
        //2.获取user_id   请求http://localhost:8081/user/{user_id}   调用了user-service    远程调用  ->User
        String url = "http://localhost:8081/user/" + order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        //3.将获取的User封装到order.user属性中
        order.setUser(user);
        // 4.返回
        return order;
    }
}
